/**
 * 
 */
package com.ms.game.common.utility;

import com.xpec.c4.game.time.TimeSys;
import com.xpec.c4.service.group.datalayer.IShareGroupData;

/**
 * 兩光的簡易計時器
 * 
 * @author kvn_yang
 * 
 */
@SuppressWarnings("serial")
public class SimpleTimer implements IShareGroupData {

	/**
	 * 計時器過期時間
	 */
	private long expireTime = 0;

	/**
	 * 最後一次設定的計時間隔，可以在時間到的時候呼叫 restart() 重新啟動計時器
	 */
	private long lastInterval = 0;

	/**
	 * 更新計時器<br>
	 * <br>
	 * 必須一直呼叫直到 return true 計時器才會結束。
	 * 
	 * @return true: 已過期<br>
	 *         false: 尚未過期
	 */
	public boolean update() {
		if (!isWorking()) {
			return false;
		}

		if (TimeSys.currentTimeMills() >= expireTime) {
			stopTimer();
			return true;
		}

		return false;
	}

	/**
	 * 開始計時
	 * 
	 * @param expireTime
	 *            使用過期時間來設定，單位: ms
	 */
	public void startByExpireTime(long expireTime) {
		if (expireTime <= 0) {
			return;
		}

		this.expireTime = expireTime;
		this.lastInterval = expireTime - TimeSys.currentTimeMills();
	}

	/**
	 * 開始計時
	 * 
	 * @param expireTime
	 *            使用剩餘時間來設定，單位: ms
	 */
	public void startByRemainTime(long remainTime) {
		if (remainTime <= 0) {
			return;
		}

		this.expireTime = TimeSys.currentTimeMills() + remainTime;
		this.lastInterval = remainTime;
	}

	/**
	 * 計時器是否正在運作中
	 * 
	 * @return true: 有<br>
	 *         false: 沒有
	 */
	public boolean isWorking() {
		if (expireTime > 0) {
			return true;
		}

		return false;
	}

	/**
	 * 停止計時器
	 */
	public void stopTimer() {
		expireTime = 0;
	}

	/**
	 * 用上次設定的時間長度重新啟動計時器
	 */
	public void restart() {
		startByRemainTime(this.lastInterval);
	}

	/**
	 * 取得距離過期還有多少時間
	 * 
	 * @return 剩餘時間
	 */
	public long getRemainTime() {
		if (!isWorking()) {
			return 0;
		}

		long rt = expireTime - TimeSys.currentTimeMills();
		if (rt < 0) {
			rt = 0;
		}

		return rt;
	}

	public long getExpireTime() {
		return expireTime;
	}

	public void setExpireTime(long expireTime) {
		this.expireTime = expireTime;
	}

	public long getLastInterval() {
		return lastInterval;
	}

	public void setLastInterval(long lastInterval) {
		this.lastInterval = lastInterval;
	}
}
